package com.cleaningcloud.erp.service.impl;

import com.cleaningcloud.common.security.utils.SecurityUtils;
import com.cleaningcloud.erp.domain.ErpAccountsPayable;
import com.cleaningcloud.erp.domain.vo.ErpAccountsPayableVo;
import com.cleaningcloud.erp.mapper.*;
import com.cleaningcloud.erp.service.IErpAccountsPayableService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Objects;

/**
 * 应付账款Service业务层处理
 *
 * @author cleaningcloud
 * @date 2024-09-30
 */
@Service
public class ErpAccountsPayableServiceImpl implements IErpAccountsPayableService {
    @Autowired
    private ErpAccountsPayableMapper erpAccountsPayableMapper;

    @Autowired
    private ErpWarehousingMapper erpWarehousingMapper;

    @Autowired
    private ErpProcureMapper erpProcureMapper;

    @Autowired
    private ErpProcudeReturnMapper erpProcudeReturnMapper;

    @Autowired
    private ErpSaleReturnMapper erpSaleReturnMapper;

    /**
     * 查询应付账款
     *
     * @param payableId 应付账款主键
     * @return 应付账款
     */
    @Override
    public ErpAccountsPayable selectErpAccountsPayableByPayableId(Long payableId) {
        return erpAccountsPayableMapper.selectErpAccountsPayableByPayableId(payableId);
    }

    /**
     * 查询应付账款列表
     *
     * @param erpAccountsPayable 应付账款
     * @return 应付账款
     */
    @Override
    public List<ErpAccountsPayableVo> selectErpAccountsPayableList(ErpAccountsPayable erpAccountsPayable) {
        return erpAccountsPayableMapper.selectErpAccountsPayableList(erpAccountsPayable);
    }

    /**
     * 新增应付账款
     *
     * @param erpAccountsPayable 应付账款
     * @return 结果
     */
    @Override
    public int insertErpAccountsPayable(ErpAccountsPayable erpAccountsPayable) {
        return erpAccountsPayableMapper.insertErpAccountsPayable(erpAccountsPayable);
    }

    /**
     * 修改应付账款
     *
     * @param erpAccountsPayable 应付账款
     * @return 结果
     */
    @Override
    public int updateErpAccountsPayable(ErpAccountsPayable erpAccountsPayable) {
        return erpAccountsPayableMapper.updateErpAccountsPayable(erpAccountsPayable);
    }

    /**
     * 批量删除应付账款
     *
     * @param payableIds 需要删除的应付账款主键
     * @return 结果
     */
    @Override
    public int deleteErpAccountsPayableByPayableIds(Long[] payableIds) {
        return erpAccountsPayableMapper.deleteErpAccountsPayableByPayableIds(payableIds);
    }

    /**
     * 删除应付账款信息
     *
     * @param payableId 应付账款主键
     * @return 结果
     */
    @Override
    public int deleteErpAccountsPayableByPayableId(Long payableId) {
        return erpAccountsPayableMapper.deleteErpAccountsPayableByPayableId(payableId);
    }

    @Override
    @Transactional
    public int paymentErpAccountsPayable(ErpAccountsPayable erpAccountsPayable) {
        erpAccountsPayable.setOddMoney(erpAccountsPayable.getOddSumMoney());
        erpAccountsPayable.setUserId(SecurityUtils.getUserId());
        erpAccountsPayable.setUserName(SecurityUtils.getUsername());
        erpAccountsPayable.setOddStatus(1);
        erpAccountsPayable.setPayTime(new Date());
//        // 生成采购入库数据
//        ErpWarehousing erpWarehousing = new ErpWarehousing();
//        // 采购入库明细
//        List<ErpWarehousingDetails> erpWarehousingDetailsList = new ArrayList<>();
//        if (erpAccountsPayable.getOddType() == 1) {
//            ErpProcureVo erpProcure = erpProcureMapper.getProcureByProcureNo(erpAccountsPayable.getOddNo());
//            Optional.ofNullable(erpProcure).orElseThrow(() -> new RuntimeException("采购单查询失败！"));
//            // 预计入库量  统计采购明细采购数量
//            int answerScheduledReceipt = (int) erpProcure.getDetailsList()
//                    .stream()
//                    .mapToDouble(ErpProcureDetails::getProcureNumber)
//                    .sum();
//            // 销售出库单字段赋值
//            erpWarehousing = setWarehousingFields(erpAccountsPayable, null, answerScheduledReceipt);
//            erpWarehousingMapper.insertErpWarehousing(erpWarehousing);
//            // 采购单明细复制到采购入库明细
//            erpWarehousingDetailsList = getErpWarehousingDetails(erpProcure.getDetailsList(), erpWarehousing);
//        } else if (erpAccountsPayable.getOddType() == 2) {
//            // 销售退换货单
//            ErpSaleReturnVo erpSaleReturnVo = erpSaleReturnMapper.selectErpSaleReturnBySaleReturnOdd(erpAccountsPayable.getOddNo());
//            Optional.ofNullable(erpSaleReturnVo).orElseThrow(() -> new RuntimeException("销售单查询失败！"));
//            // 过滤出销售退换明细中的换货商品
//            List<ErpReturnDetailsVo> erpReturnDetailsList = erpSaleReturnVo.getDetailsList().stream()
//                    .filter(n -> n.getReturnCommodityType() == 2).collect(Collectors.toList());
//            erpSaleReturnVo.setDetailsList(erpReturnDetailsList);
//            // 计算应入库总量
//            int answerScheduledReceipt = (int) erpReturnDetailsList
//                    .stream()
//                    .mapToDouble(ErpReturnDetails::getCommodityNumber)
//                    .sum();
//            // 取出仓库id 换货商品取销售退换货选中的仓库id
//            Long wareId = erpSaleReturnVo.getWareId();
//            // 采购入库单字段赋值
//            erpWarehousing = setWarehousingFields(erpAccountsPayable, wareId, answerScheduledReceipt);
//            erpWarehousingMapper.insertErpWarehousing(erpWarehousing);
//            // 采购退换货单明细
//            erpWarehousingDetailsList = getErpWarehousingDetailsByProcudeReturn(erpReturnDetailsList, erpWarehousing);
//        } else if (erpAccountsPayable.getOddType() == 3) {
//            // 采购退换货单
//            ErpProcudeReturnVo erpProcudeReturnVo = erpProcudeReturnMapper.selectErpProcudeReturnByProcudeReturnOdd(erpAccountsPayable.getOddNo());
//            Optional.ofNullable(erpProcudeReturnVo).orElseThrow(() -> new RuntimeException("采购单查询失败！"));
//            // 过滤出采购退换明细中的换货商品
//            List<ErpReturnDetailsVo> erpReturnDetailsList = erpProcudeReturnVo.getDetailsList().stream()
//                    .filter(n -> n.getReturnCommodityType() == 2).collect(Collectors.toList());
//            erpProcudeReturnVo.setDetailsList(erpReturnDetailsList);
//            // 计算应入库总量
//            int answerScheduledReceipt = (int) erpReturnDetailsList
//                    .stream()
//                    .mapToDouble(ErpReturnDetails::getCommodityNumber)
//                    .sum();
//            // 取出仓库id 换货商品取采购退换货选中的仓库id
//            Long wareId = erpProcudeReturnVo.getWareId();
//            // 销售出库单字段赋值
//            erpWarehousing = setWarehousingFields(erpAccountsPayable, wareId, answerScheduledReceipt);
//            erpWarehousingMapper.insertErpWarehousing(erpWarehousing);
//            // 采购退换货单明细
//            erpWarehousingDetailsList = getErpWarehousingDetailsByProcudeReturn(erpReturnDetailsList, erpWarehousing);
//        }
//        if (erpWarehousingDetailsList.size() > 0) {
//            erpWarehousingMapper.batchWarehousingDetailsInsert(erpWarehousingDetailsList);
//        }
        return erpAccountsPayableMapper.updateErpAccountsPayable(erpAccountsPayable);
    }

    @Override
    public Map<String, Objects> statistics() {
        return erpAccountsPayableMapper.statistics();
    }


}
